package br.com.duduso.conferencia_claro_desktop.dbf;

import java.io.File;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 *
 * @author duduso
 */
public class ArquivoUtils {

    public static String getStringNumerica(int numero, int casasDecimais){
            if(numero <= 0){
                    return getZeros(casasDecimais);
            }
            int length = String.valueOf(numero).length();
            if(length > casasDecimais){
                    return String.valueOf(numero);
            }else{
                    return (getZeros(casasDecimais - length) + String.valueOf(numero));
            }
    }

    public static String getStringFormatada(String input, int tamanho, boolean completarDireita){
            if(input == null || input.length() == 0){
                    return getBlankSpaces(tamanho);
            }
            int length = input.length();
            if(length > tamanho){
                    return input.substring(0, tamanho);
            }else{
                    String blankSpaces = getBlankSpaces(tamanho - length);
                    if(completarDireita){
                            return (input + blankSpaces);
                    }else{
                            return (blankSpaces + input);
                    }
            }
    }

    private static String getZeros(int quantidade){
            String zeros = "";
            for(int i = 0; i < quantidade; i++){
                    zeros += "0";
            }
            return zeros;
    }

    private static String getBlankSpaces(int quantidade){
            String blankSpaces = "";
            for(int i = 0; i < quantidade; i++){
                    blankSpaces += " ";
            }
            return blankSpaces;
    }

    public static String getCabecalhoArquivo(int sequencial, String cnpj, String filial, int digito,
            String razaoSocial, String nomePerfil, String formaAviso, int numeroRemessa, 
            Date dataHoraRemessa, String logon){

            SimpleDateFormat sdfData = new SimpleDateFormat("yyyyMMdd");
            SimpleDateFormat sdfHora = new SimpleDateFormat("HHmmss");
            
            StringBuilder cabecalho = new StringBuilder();

            //Tamanho:09 - Início: 01 - Fim: 09
            //Sequência do Registro no Arquivo -> Igual a 000000001
            cabecalho.append(getStringNumerica(sequencial, 9));

            //Tamanho:01 - Início: 10 - Fim: 10
            //Código do Registro -> Igual a Zero '0'
            cabecalho.append("0");

            //Tamanho:25 - Início: 11 - Fim: 35
            //Identificação do Arquivo - 'GERENCIE CARTEIRA-LOTE'
            cabecalho.append(getStringFormatada("GERENCIE CARTEIRA-LOTE", 25, true));

            //Tamanho:08 - Início: 36 - Fim: 43
            //Número do CNPJ do Solicitante -> Ajuste à Direita e Preenchido Com Zeros à Esquerda
            cnpj = cnpj.replaceAll("\\.", "").replaceAll("-", "").replaceAll("/", "");
            cabecalho.append(getStringFormatada(cnpj, 8, true));
            
            //Tamanho:04 - Início: 44 - Fim: 47
            //Filial do Solicitante
            cabecalho.append(getStringFormatada(filial, 4, true));

            //Tamanho:02 - Início: 48 - Fim: 49
            //Dígito do Solicitante
            cabecalho.append(getStringNumerica(digito, 2));

            //Tamanho:70 - Início: 50 - Fim: 119
            //Razão Social
            cabecalho.append(getStringFormatada(razaoSocial, 70, true));

            //Tamanho:20 - Início: 120 - Fim: 139
            //Nome do Perfil
            cabecalho.append(getStringFormatada(nomePerfil, 20, true));

            //Tamanho:01 - Início: 140 - Fim: 140
            //Forma de Aviso do Gerencie Via E-mail
            // 0 - Recebe | 1 - Não Recebe
            cabecalho.append(getStringFormatada(formaAviso, 1, true));

            //Tamanho:08 - Início: 141 - Fim: 148
            //Número da Remessa - Sequencial Iniciado em 00000001
            cabecalho.append(getStringNumerica(numeroRemessa, 8));

            //Tamanho:08 - Início: 149 - Fim: 156
            //Data da Remessa - Formato: AAAAMMDD
            cabecalho.append(sdfData.format(dataHoraRemessa));

            //Tamanho:06 - Início: 157 - Fim: 162
            //Hora do Envio da Remessa - Formato: HHMMSS
            cabecalho.append(sdfHora.format(dataHoraRemessa));

            //Tamanho:01 - Início: 163 - Fim: 163
            //Migra - Uso Interno
            cabecalho.append(getStringFormatada(null, 1, true));

            //Tamanho:05 - Início: 164 - Fim: 168
            //Código do Cliente - Preencher Com ZEROS Quando Não Souber
            cabecalho.append(getZeros(5));

            //Tamanho:08 - Início: 169 - Fim: 176
            //Logon Enviado Para Contabilização
            cabecalho.append(getStringFormatada(logon, 8, true));

            //Tamanho:08 - Início: 177 - Fim: 200
            //Logon Enviado Para Contabilização
            cabecalho.append(getBlankSpaces(24));

            //Adicionando Quebra de Linha ao Final do Cabeçalho
            cabecalho.append("\n");

            return cabecalho.toString();

    }

    public static String getConteudoArquivo(int sequencial, String cnpj, String filial,
            String digitoEmpresa, String nomeReferencia, String grupoEmail){

            StringBuilder conteudo = new StringBuilder();

            //Tamanho:09 - Início: 01 - Fim: 09
            //Sequência do Registro no Arquivo -> Incrementado
            //de 1 a Cada Registro de Detalhe
            conteudo.append(getStringNumerica(sequencial, 9));

            //Tamanho:01 - Início: 10 - Fim: 10
            //Código do Registro -> '1'
            conteudo.append("1");

            //Tamanho:08 - Início: 11 - Fim: 18
            //Número do CNPJ da Empresa Gerenciada
            cnpj = cnpj.replaceAll("\\.", "").replaceAll("-", "").replaceAll("/", "");
            conteudo.append(getStringFormatada(cnpj, 8, true));

            //Tamanho:04 - Início: 19 - Fim: 22
            //Filial da Empresa Gerenciada (opcional)
            conteudo.append(getStringFormatada(filial, 4, true));

            //Tamanho:02 - Início: 23 - Fim: 24
            //Filial da Empresa Gerenciada (opcional)
            conteudo.append(getStringFormatada(digitoEmpresa, 2, true));

            //Tamanho:01 - Início: 25 - Fim: 25
            //Tipo de Operação: I - Inclusão / E - Exclusão
            conteudo.append("I");

            //Tamanho:03 - Início: 26 - Fim: 28
            //Prazo de Monitoramento a Partir da Data de Inclusão:
            //090 - Noventa Dias
            //120 - Cento e Vinte Dias
            //180 - Cento e Oitenta Dias
            //999 - Prazo Indeterminado
            conteudo.append("090");

            //Tamanho:15 - Início: 29 - Fim: 43
            //Nome da Referência (opcional)
            conteudo.append(getStringFormatada(nomeReferencia, 15, true));

            //Tamanho:15 - Início: 44 - Fim: 58
            //Nome do Grupo de Email (obrigatório para recebimento de aviso de email)
            conteudo.append(getStringFormatada(grupoEmail, 15, true));

            //Tamanho:142 - Início: 59 - Fim: 200
            //Área Reservada
            conteudo.append(getBlankSpaces(142));

            //Adicionando Quebra de Linha ao Final do Cabeçalho
            conteudo.append("\n");

            return conteudo.toString();

    }

    public static void main(String[] args) throws Exception{

            StringBuilder arquivo = new StringBuilder();

            String cabecalho = getCabecalhoArquivo(1, "18.715.391/0001-96", "FILIAL BETIM",
                    1, "TESTE DE GERAÇÃO DE ARQUIVOS", "PERFIL TESTE", "0", 72, new Date(), "duduso");

            arquivo.append(cabecalho);

            for(int i = 0; i <1000; i++){
                    arquivo.append(getConteudoArquivo((i + 1), "18.715.391/0001-96", "BETIM", "09", "NOME_TESTE", "teste@oi.com.br"));
            }

            PrintWriter writer = new PrintWriter(new File("/home/duduso/Teste.txt"));
            writer.print(arquivo.toString());
            writer.close();

    }

}
